[レポート][株式会社Flatt Security] Linux kernelのケーススタディから学ぶ、人間が見つけるべき脆弱性 – CODE BLUE 2023 #codeblue_jp
こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。
今回はCODE BLUE 2023で行われた以下のセッションのレポートです。
[株式会社Flatt Security] Linux kernelのケーススタディから学ぶ、人間が見つけるべき脆弱性
Flatt Securityでは、脆弱性リサーチプロジェクトとして多くのプロダクトの脆弱性を発見・報告してきました。本セッションでは、プロジェクトで報告されたLinux kernel上の脆弱性に絞って技術的な解説を行います。 今回解説する脆弱性は、いずれも技術者が手動でコードを読み解くことで発見されたものです。一方で、Linux kernelのような著名かつ巨大なプロジェクトは、Fuzzingツールなどの脆弱性の自動検査ツールの研究対象とされ、専用のツールが作成されることもあります。 このような脆弱性発見の自動化におけるレッドオーシャン的な領域では、単純な脆弱性は淘汰される状況にあります。そのため、今回紹介する脆弱性が、脆弱性検査の自動化技術の発展によって淘汰されにくい「今後も人間が見つけるべき脆弱性」であると考えます。 本セッションでは「人間が見つけるべき脆弱性」の特徴や、発見の方法などについてもFlatt Securityが独自に調査した情報を踏まえ、レイヤーに囚われない形で解説します。また、その上で独自に取り組んでいる脆弱性診断の手法についてもご紹介します。
Presented by : 志賀 遼太 (執行役員・プロフェッショナルサービス事業CTO)
レポート
- 簡易解説
- 最初にプロジェクト見つけたのはパフォーマンスカウンターでの脆弱性
- CVE-2020-14351(CVSS 7.8)
- munmap(2)が呼び出されるたびに参照が増加
- 特定の知識がないと見つけられなかった
- free_uidが複数回呼び出されてしまう
- Double Free
- 2つ目
- CVE-2021-20226(CVSS 7.8)
- 3つ目
- CVE-2021-20239(CVSS 3.3)
- Linux Kernel における情報漏えいに関する脆弱性
- https://flatt.tech/cve/CVE-2021-20239
- どんなフィルタを設定しようとしているかをフィルタするプログラム
- Double Fetch防止
- set_fsというテクニックを使っている
- フェッチされるのはoptvalだけではない
- CVE-2021-20239(CVSS 3.3)
- 4つ目
- CVE-2021-34866(CVSS 8.8)
- Linux Kernel の eBPF における Type Confusion による権限昇格
- https://flatt.tech/cve/CVE-2021-34866
- eBPFでの脆弱性はこれ以外にもいくつかある
- リングバッファ型の制約が無かったために起こった脆弱性
- CVE-2021-34866(CVSS 8.8)
- 5つ目
- CVE-2021-34899(CVSS 7.8)
- 6つ目
- CVE-2022-1043(CVSS 8.8)
- allocateが成功しているにも関わらず、一周回って1が返ってくる脆弱性
- CVE-2022-1043(CVSS 8.8)
- 7つ目
- CVE-2023-39191(CVSS 8.2)
- 2つ検証器があった
- 先頭の検証器ではポインタのがdynptrかどうかを見ていたが、2つ目の検証器では見れていなかった
- CVE-2023-39191(CVSS 8.2)
- 8つ目
- NOCVE_ebpf_improper_offset_verification
- ebpfにおいて加算/減算についての考慮漏れによる脆弱性
- NOCVE_ebpf_improper_offset_verification
- 9つ目
- NOCVE_ebpf_insufficient_reg_type_check
- ebpfではJMP命令の時にはポインタの比較を行っている
- しかし、CMPEXCHGでも可能なので、そこが脆弱性になっていた
- NOCVE_ebpf_insufficient_reg_type_check
- 10個目
- NOCVE_ebpf_ringbuf_race
- チャンクヘッダを破壊可能
- NOCVE_ebpf_ringbuf_race
- 11個目
- ZDI_20_1440_ebpf_range_check_bypass(CVSS 8.8?)
- 配列の領域外参照になってしまうによって発生する脆弱性
- 範囲付き数字同士の論理右シフト結果の取りうる範囲の過程を計算ミス
- メモリの範囲外アクセスに繋がった
- ZDI_20_1440_ebpf_range_check_bypass(CVSS 8.8?)
- 12個目
- ZDI_21_1223_cmtp_double_free
- Bluetoothのセッションフリー機能
- 使うとdouble freeが発生
- ZDI_21_1223_cmtp_double_free
- 最初にプロジェクト見つけたのはパフォーマンスカウンターでの脆弱性
- 何が起きてはいけないか?という「知識」が必要
- 人間が見つける必要がある
- 機械的にクラッシュを引き起こさせることは出来ない
- よくあるWebセキュリティでは「何が起きてはいけないか」に対する共通の明確なアンサーがある
- しかし、linux kernelのセキュリティにはそういうものが無い
- 専用のルールを作り込むことで適切な「知識」の「学習」が可能
- 見つけるためには特殊/複雑な条件に関する「知識」が必要な脆弱性もある
- まとめ
- 今後の世の中は、ホワイトボックスな手動アプローチ、またはそれ以外の機械的なアプローチに集約されるのではないか
感想
「何が起きてはいけないか?」に対する共通の明確なアンサーが無い、見つけるためには特有の知識が必要なLinux Kernelの脆弱性についてのセッションでした。
タイトルにもなっていた「人間が見つけるべき脆弱性」とは、特殊/複雑な条件における特有の知識が無いと見つけられないような脆弱性のことでした。
自分はこの分野に明るくないですが、基礎的な知識だけでなく、脆弱性を理解するためにも今回解説のあった特殊な条件についても学習を行いたいですね。